﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ColoriFacade : FacadeBase<GestionePolveriEntities>
    {
        private string sequenzaNomi = string.Empty;
        GestionePolveriEntities context = null;

        public ColoriFacade()
        {
            context = this.GetContext();
        }

        public ColoriFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<Colore> GetAll()
        {
            List<Colore> retValue = null;

            //Applicazione = (from a in x.ComposizioneColori where a.IDColore == x.IDColore select a.Applicazione).Join(x => x),
            try
            {
                var obj = from x in context.AnagColori
                          select new Colore
                          {
                              Applicazione = "",
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                    foreach (Colore p in retValue)
                    {
                        List<LookUp_FamiglieColori_ColoriAbbinati_Result> r = null;
                        r = mmm.FindAll(x => (x.ColoriAbbinati == null ? false : x.ColoriAbbinati.Contains(p.CodiceColore)));
                        foreach (LookUp_FamiglieColori_ColoriAbbinati_Result r1 in r)
                        {
                            if (r1 != null)
                            {
                                if(!p.Applicazione.Contains(r1.Applicazione))
                                {
                                    if (!r1.Applicazione.Contains(p.Applicazione))
                                    {
                                        if (string.IsNullOrWhiteSpace(p.Applicazione))
                                        {
                                            p.Applicazione += r1.Applicazione;
                                        }
                                        else
                                        {
                                            p.Applicazione += "," + r1.Applicazione;
                                        }
                                    }
                                    else
                                    {
                                        p.Applicazione = r1.Applicazione;
                                    }
                                }
                            }
                        }
                    }

                    //ComposizioneColoreFacadeExt ccfext = new ComposizioneColoreFacadeExt();
                    //foreach (Colore c in retValue)
                    //{
                    //    c.Applicazione = ccfext.GetApplicazioneColore(c.ID);
                    //}
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        private string Aggiungi(string a)
        {
            return sequenzaNomi += a;
        }

        public bool Add(Colore data)
        {
            bool retValue = false;

            try
            {
                if (!context.AnagColori.Any(x => x.CodiceColore == data.CodiceColore))
                {
                    AnagColori imp = new AnagColori();
                    imp.CodiceColore = data.CodiceColore;
                    imp.Descrizione = data.Descrizione;
                    imp.Note = data.Note;
                    imp.IDFamiglia = data.Famiglia.ID;
                    imp.DataOperazione = data.DataOperazione;
                    imp.IsGenerico = data.IsGenerico;

                    if (data.PianoColore != null)
                    {
                        imp.IsDiSerie = data.PianoColore.IsDiSerie;
                        imp.Fascia = data.PianoColore.Fascia;
                        imp.TempiConsegna = data.PianoColore.TempiConsegna;
                    }

                    context.AnagColori.AddObject(imp);
                    context.SaveChanges();

                    data.ID = imp.IDColore;

                    retValue = true;
                }
                else
                {
                    AnagColori imp = context.AnagColori.FirstOrDefault(x => x.CodiceColore == data.CodiceColore);
                    if (imp != null)
                    {
                        data.CodiceColore = imp.CodiceColore;
                        data.Descrizione = imp.Descrizione;
                        data.Note = imp.Note;
                        data.Famiglia.ID = imp.IDFamiglia;
                        data.DataOperazione = imp.DataOperazione;
                        data.IsGenerico = (imp.IsGenerico.HasValue ? imp.IsGenerico.Value : false);

                        if (data.PianoColore != null)
                        {
                            imp.IsDiSerie = data.PianoColore.IsDiSerie;
                            imp.Fascia = data.PianoColore.Fascia;
                            imp.TempiConsegna = data.PianoColore.TempiConsegna;
                        }
                    }
                }

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Delete(Colore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == data.ID
                          select x;

                if (obj.Any())
                {
                    AnagColori m_colore = (AnagColori)obj.FirstOrDefault();

                    var obj2 = from x in context.StoricoNomiColori where x.IDColore == m_colore.IDColore select x;
                    if (obj2.Any())
                    {
                        List<StoricoNomiColori> m_nomiColori = (List<StoricoNomiColori>)obj2.ToList();
                        foreach (StoricoNomiColori sn in m_nomiColori)
                        {
                            context.StoricoNomiColori.DeleteObject(sn);
                        }
                    }

                    var obj3 = from x in context.Partite where x.IDColore == m_colore.IDColore select x;
                    if (obj3.Any())
                    {
                        PartiteFacade pf = new PartiteFacade();
                        pf.Delete(m_colore.IDColore);
                    }

                    context.AnagColori.DeleteObject(m_colore);
                    context.SaveChanges();

                    retValue = true;

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public bool Modify(Colore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == data.ID
                          select x;

                if (obj.Any())
                {
                    Transact(() =>
                    {
                        AnagColori imp = obj.FirstOrDefault();

                        imp.Descrizione = data.Descrizione;
                        imp.Note = data.Note;
                        imp.IDFamiglia = data.Famiglia.ID;
                        imp.DataOperazione = data.DataOperazione;
                        imp.IsGenerico = data.IsGenerico;

                        if (data.PianoColore != null)
                        {
                            imp.IsDiSerie = data.PianoColore.IsDiSerie;
                            imp.Fascia = data.PianoColore.Fascia;
                            imp.TempiConsegna = data.PianoColore.TempiConsegna;
                        }
                        else
                        {
                            imp.IsDiSerie = null;
                            imp.Fascia = string.Empty;
                            imp.TempiConsegna = string.Empty;
                        }

                        if (imp.CodiceColore != data.CodiceColore)
                        {
                            StoricoNomiColori snc = new StoricoNomiColori();
                            snc.DataModifica = DateTime.Now;
                            snc.IDColore = imp.IDColore;
                            snc.Nome = imp.CodiceColore;

                            context.StoricoNomiColori.AddObject(snc);

                            imp.CodiceColore = data.CodiceColore;
                        }

                        context.SaveChanges();

                        retValue = true;
                    });
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Colore Get(int id)
        {
            Colore retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == id
                          select new Colore
                          {
                              ID = x.IDColore,
                              Descrizione = x.Descrizione,
                              CodiceColore = x.CodiceColore,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Colore Get(string codiceColore)
        {
            Colore retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.CodiceColore == codiceColore
                          select new Colore
                          {
                              ID = x.IDColore,
                              Descrizione = x.Descrizione,
                              CodiceColore = x.CodiceColore,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public string[] GetStoricoNomi(int idColore)
        {
            string[] retValue = null;

            try
            {
                var obj = from x in context.StoricoNomiColori
                          where x.IDColore == idColore
                          select x.Nome;

                if (obj.Any())
                {
                    retValue = obj.ToArray();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Colore> GetAllEssential()
        {
            List<Colore> retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          select new Colore
                          {
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore { 
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Colore> GetColoriByFamiglia(int idFamiglia)
        {
            List<Colore> retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.AnagFamiglie.IDFamiglia == idFamiglia
                          select new Colore
                          {
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Colore> GetGenerici()
        {
            List<Colore> retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IsGenerico.Value
                          select new Colore
                          {
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Colore> GetGenerico(int idFamiglia)
        {
            List<Colore> retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IsGenerico.Value && x.IDFamiglia == idFamiglia
                          select new Colore
                          {
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                              PianoColore = new PianoColore() { IsDiSerie = (x.IsDiSerie.HasValue ? x.IsDiSerie.Value : false), Fascia = x.Fascia, TempiConsegna = x.TempiConsegna },
                              DataOperazione = (x.DataOperazione.HasValue ? x.DataOperazione : null),
                              IsGenerico = (x.IsGenerico.HasValue ? x.IsGenerico.Value : false)
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public FamigliaColore GetFamiglia(int idColore)
        {
            FamigliaColore retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          join y in context.AnagFamiglie on x.IDFamiglia equals y.IDFamiglia
                          where x.IDColore == idColore
                          select new FamigliaColore
                                             {
                                                 ID = y.IDFamiglia,
                                                 Descrizione = y.Descrizione
                                             };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
